package hip.util.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.Map.Entry;
import java.util.Set;

public class Json2Xml {

    /**
     * json转xml
     *
     * @return String
     */
    public static String json2Xml(String jsonStr) {
        if (jsonStr != null) {
            JSONObject json = (JSONObject) JSON.parse(jsonStr);
            if (json != null) {
                Set<Entry<String, Object>> sets = json.entrySet();
                Document doc = DocumentHelper.createDocument();
                for (Entry<String, Object> set : sets) {
                    String key = set.getKey();
                    Element root = doc.addElement(key);
                    Object values = set.getValue();
                    if (values != null) {
                        if (values instanceof JSONObject) {
                            JSONObject jsonO = (JSONObject) values;
                            json2Xml(root, jsonO);
                        } else if (values instanceof JSONArray) {
                            JSONArray jsonA = (JSONArray) values;
                            for (Object jsonO : jsonA) {
                                json2Xml(root, (JSONObject) jsonO);
                            }
                        }
                    }
                    return doc.asXML();
                }
            }
        }
        return null;
    }

    /**
     * json转xml
     */
    public static void json2Xml(Element root, JSONObject json) {
        if (root != null && json != null) {
            Set<Entry<String, Object>> sets = json.entrySet();
            for (Entry<String, Object> set : sets) {
                String key = set.getKey();
                if (key.startsWith("#text")) {
                    root.setText(set.getValue().toString());
                } else if (key.startsWith("@")) {
                    root.addAttribute(key.substring(1), set.getValue().toString());
                } else {
                    Element childElement = root.addElement(key);
                    Object values = set.getValue();
                    if (values != null) {
                        if (values instanceof JSONObject) {
                            JSONObject jsonO = (JSONObject) values;
                            json2Xml(childElement, jsonO);
                        } else if (values instanceof JSONArray) {
                            JSONArray jsonA = (JSONArray) values;
                            for (Object jsonO : jsonA) {
                                json2Xml(childElement, (JSONObject) jsonO);
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * json转xml   支持不用 #text形式也能赋值
     */
    public static void json2XmlExpand(Element root, JSONObject json) {
        if (root != null && json != null) {
            Set<Entry<String, Object>> sets = json.entrySet();
            for (Entry<String, Object> set : sets) {
                String key = set.getKey();
                if (key.startsWith("#text")) {
                    root.setText(set.getValue().toString());
                } else if (key.startsWith("@")) {
                    root.addAttribute(key.substring(1), set.getValue().toString());
                } else {
                    Object values = set.getValue();
                    if (values != null) {
                        if (values instanceof JSONObject) {
                            Element childElement = root.addElement(key);
                            JSONObject jsonO = (JSONObject) values;
                            json2XmlExpand(childElement, jsonO);
                        } else if (values instanceof JSONArray) {
                            JSONArray jsonA = (JSONArray) values;
                            for (Object jsonO : jsonA) {
                                Element childElement = root.addElement(key);
                                json2XmlExpand(childElement, (JSONObject) jsonO);
                            }
                        } else {
                            Element childElement = root.addElement(key);
                            childElement.setText(set.getValue().toString());
                        }
                    }
                }
            }
        }
    }
}

